// file: event.emitter.ts

// 定义监听器函数的类型
type Listener<T> = (payload: T) => void;

/**
 * 一个简单的事件发射器类，用于实现发布-订阅模式。
 */
export class EventEmitter<T extends Record<string, any>> {
    private listeners: { [K in keyof T]?: Listener<K extends keyof T ? T[K] : never>[] } = {};

    /**
     * 订阅一个事件。
     * @param eventName 事件名称
     * @param listener 回调函数
     */
    public on<K extends keyof T>(eventName: K, listener: Listener<T[K]>): void {
        if (!this.listeners[eventName]) {
            this.listeners[eventName] = [];
        }
        this.listeners[eventName]!.push(listener as any);
    }

    /**
     * 发射一个事件。
     * @param eventName 事件名称
     * @param payload 传递给监听器的数据
     */
    public emit<K extends keyof T>(eventName: K, payload: T[K]): void {
        if (this.listeners[eventName]) {
            this.listeners[eventName]!.forEach(listener => listener(payload));
        }
    }
}
